/**
 * 
 */
package com.zz.datareport.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.jfinal.plugin.activerecord.Record;

/**
 * @author Wangys
 * @date 2018年10月7日
 */
public class DataObjectToJavaBean {
	private static String datePattern = "yyyy-MM-DD HH:mm:dd";
	private static final SimpleDateFormat sdf = new SimpleDateFormat(datePattern);	
	
	public DataObjectToJavaBean(){
		
	}
	/**
	 * 重写构造方法，传入自定义的日期格式
	 * @param datePattern 自定义的日期格式
	 */
	public DataObjectToJavaBean(String datePattern){
		this.datePattern=datePattern;
	}
	public <T> T recover(Record data, Class<T> objC) {
		T bean = null;
		try {
			bean = objC.newInstance();
			// 获取传入对象的注解值
			Field[] fields = bean.getClass().getDeclaredFields();
			for (Field field : fields) {
				// 判断该字段是否存在自定义的注解
				boolean isannotation = field.isAnnotationPresent(TestZJ.class);
				if (isannotation) {
					TestZJ annotation = field.getAnnotation(TestZJ.class);
					// 数据库表对应的列名
					String columnName = annotation.columnName();
					// 根据列名获得查询结果的值
					Object value = data.get(columnName);
					// 将值set到bean中
					String fieldName = field.getName();
					//返回一个 Type 对象，它表示此 Field 对象所表示字段的声明类型
					Type genericType = field.getGenericType();
					value = validateColumnValueAndConvert(value,genericType.getTypeName());
					System.out.println(genericType.getTypeName());
					Method method = objC.getDeclaredMethod(
							"set" + fieldName.substring(0,1).toUpperCase()+fieldName.substring(1,fieldName.length()), genericType.getTypeName().getClass());
					method.invoke(bean, value);
				}
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return bean;
	}
	/**
	 * 判断查询出的record中的列的值是否存在空值，如果是null则返回空。
	 * 并将record的返回值转成实体对象属性所指定的类型值
	 * @param cValue 数据库中的值
	 * @param filedType 属性类型
	 * @return
	 * @throws ParseException 
	 */
	private Object validateColumnValueAndConvert(Object cValue,String filedType) throws ParseException{
		if(cValue!=null){
			if(filedType.equals("java.lang.String")){
				return cValue.toString();
			}
			if(filedType.equals("java.lang.Integer")){
				return (Integer)cValue;
			}
			if(filedType.equals("java.lang.Float")){
				return (Float)cValue;
			}
			if(filedType.equals("java.lang.Double")){
				return (Double)cValue;
			}
			if(filedType.equals("java.util.Date")){
				return sdf.parse(cValue.toString());
			}
		}
		return "";
	}
	
}
